; From tree-sitter-python, licensed under MIT License

(identifier) @variable

; Reset highlighting in f-string interpolations
(interpolation) @none

; ; Identifier naming conventions
((identifier) @type
 (#lua-match? @type "^[A-Z].*[a-z]"))

((identifier) @constant
 (#lua-match? @constant "^[A-Z][A-Z_0-9]*$"))

((identifier) @constant.builtin
 (#lua-match? @constant.builtin "^__[a-zA-Z0-9_]*__$"))

((identifier) @constant.builtin
 (#any-of? @constant.builtin
           ;; https://docs.python.org/3/library/constants.html
           "NotImplemented"
           "Ellipsis"
           "quit"
           "exit"
           "copyright"
           "credits"
           "license"))

((attribute
    attribute: (identifier) @field)
 (#match? @field "^([A-Z])@!.*$"))

((identifier) @type.builtin
 (#any-of? @type.builtin
              ;; https://docs.python.org/3/library/exceptions.html
              "BaseException" "Exception" "ArithmeticError" "BufferError" "LookupError" "AssertionError" "AttributeError"
              "EOFError" "FloatingPointError" "GeneratorExit" "ImportError" "ModuleNotFoundError" "IndexError" "KeyError"
              "KeyboardInterrupt" "MemoryError" "NameError" "NotImplementedError" "OSError" "OverflowError" "RecursionError"
              "ReferenceError" "RuntimeError" "StopIteration" "StopAsyncIteration" "SyntaxError" "IndentationError" "TabError"
              "SystemError" "SystemExit" "TypeError" "UnboundLocalError" "UnicodeError" "UnicodeEncodeError" "UnicodeDecodeError"
              "UnicodeTranslateError" "ValueError" "ZeroDivisionError" "EnvironmentError" "IOError" "WindowsError"
              "BlockingIOError" "ChildProcessError" "ConnectionError" "BrokenPipeError" "ConnectionAbortedError"
              "ConnectionRefusedError" "ConnectionResetError" "FileExistsError" "FileNotFoundError" "InterruptedError"
              "IsADirectoryError" "NotADirectoryError" "PermissionError" "ProcessLookupError" "TimeoutError" "Warning"
              "UserWarning" "DeprecationWarning" "PendingDeprecationWarning" "SyntaxWarning" "RuntimeWarning"
              "FutureWarning" "ImportWarning" "UnicodeWarning" "BytesWarning" "ResourceWarning"))

; Function calls

    (decorator) @function
    ((decorator (attribute (identifier) @function))
    (#match? @function "^([A-Z])@!.*$"))
    (decorator) @function
    ((decorator (identifier) @function)
    (#match? @function "^([A-Z])@!.*$"))

    (call
    function: (identifier) @function)

    (call
    function: (attribute
                attribute: (identifier) @method))

    ((call
    function: (identifier) @constructor)
    (#lua-match? @constructor "^[A-Z]"))

    ((call
    function: (attribute
                attribute: (identifier) @constructor))
    (#lua-match? @constructor "^[A-Z]"))

; Builtin functions

    ((call
     function: (identifier) @function.builtin)
    (#any-of? @function.builtin
            "abs" "all" "any" "ascii" "bin" "bool" "breakpoint" "bytearray" "bytes" "callable" "chr" "classmethod"
            "compile" "complex" "delattr" "dict" "dir" "divmod" "enumerate" "eval" "exec" "filter" "float" "format"
            "frozenset" "getattr" "globals" "hasattr" "hash" "help" "hex" "id" "input" "int" "isinstance" "issubclass"
            "iter" "len" "list" "locals" "map" "max" "memoryview" "min" "next" "object" "oct" "open" "ord" "pow"
            "print" "property" "range" "repr" "reversed" "round" "set" "setattr" "slice" "sorted" "staticmethod" "str"
            "sum" "super" "tuple" "type" "vars" "zip" "__import__"))

; ; Function definitions

    (function_definition
      name: (identifier) @function)
    
    (type (identifier) @type)
    (type
      (subscript
        (identifier) @type)) ; type subscript: Tuple[int]
    
    ((call
      function: (identifier) @_isinstance
      arguments: (argument_list
        (_)
        (identifier) @type))
     (#eq? @_isinstance "isinstance"))

; Normal parameters
(parameters
  (identifier) @parameter)

; Lambda parameters
   (lambda_parameters
     (identifier) @parameter)
   (lambda_parameters
     (tuple_pattern
       (identifier) @parameter))

; Default parameters
(keyword_argument
  name: (identifier) @parameter)

; Naming parameters on call-site
(default_parameter
  name: (identifier) @parameter)
(typed_parameter
  (identifier) @parameter)
(typed_default_parameter
  (identifier) @parameter)


; Variadic可变参数 parameters *args, **kwargs
    (parameters
      (list_splat_pattern ; *args
        (identifier) @parameter))
    (parameters
      (dictionary_splat_pattern ; **kwargs
        (identifier) @parameter))


; Literals

    (none) @constant.builtin
    [(true) (false)] @boolean
    ((identifier) @variable.builtin
     (#eq? @variable.builtin "self"))
    
    (integer) @number
    (float) @float
    
    (comment) @comment
    (string) @string
    [
      (escape_sequence)
      "{{"
      "}}"
    ] @string.escape

; Tokens

[
    "-"
    "-="
    ":="
    "!="
    "*"
    "**"
    "**="
    "*="
    "/"
    "//"
    "//="
    "/="
    "&"
    "&="
    "%"
    "%="
    "^"
    "^="
    "+"
    "+="
    "<"
    "<<"
    "<<="
    "<="
    "<>"
    "="
    "=="
    ">"
    ">="
    ">>"
    ">>="
    "@"
    "@="
    "|"
    "|="
    "~"
    "->"
] @operator

; Keywords
[
    "and"
    "in"
    "is"
    "not"
    "or"

    "del"
] @keyword.operator

[
    "def"
    "lambda"
] @keyword.function


[
    "assert"
    "async"
    "await"
    "class"
    "exec"
    "global"
    "nonlocal"
    "pass"
    "print"
    "with"
    "as"
] @keyword

[
    "return"
    "yield"
] @keyword.return
(yield "from" @keyword.return)

(future_import_statement "from" @include "__future__" @constant.builtin)
(import_from_statement "from" @include)
"import" @include

(aliased_import "as" @include)

["if" "elif" "else" "match" "case"] @conditional

["for" "while" "break" "continue"] @repeat

; exception
    [
        "try"
        "except"
        "raise"
        "finally"
    ] @exception
    
    (raise_statement "from" @exception)
    
    (try_statement
      (else_clause
        "else" @exception))


["(" ")" "[" "]" "{" "}"] @punctuation.bracket

(interpolation
  "{" @punctuation.special
  "}" @punctuation.special)

["," "." ":" ";" (ellipsis)] @punctuation.delimiter

;; Class definitions

(class_definition name: (identifier) @type)

(class_definition
  body: (block
          (function_definition
            name: (identifier) @method)))

(class_definition
  superclasses: (argument_list
                  (identifier) @type))

((class_definition
  body: (block
          (expression_statement
            (assignment
              left: (identifier) @field))))
 (#match? @field "^([A-Z])@!.*$"))
((class_definition
  body: (block
          (expression_statement
            (assignment
              left: (_
                     (identifier) @field)))))
 (#match? @field "^([A-Z])@!.*$"))

((class_definition
  (block
    (function_definition
      name: (identifier) @constructor)))
 (#any-of? @constructor "__new__" "__init__"))

; First parameter of a classmethod is cls.
((class_definition
  body: (block
          (decorated_definition
            (decorator (identifier) @_decorator)
            definition: (function_definition
              parameters: (parameters . (identifier) @variable.builtin)))))
 (#eq? @variable.builtin "cls")
 (#eq? @_decorator "classmethod"))

(ERROR) @error
